package com.ztgf.shopping.service.template;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.ztgf.shopping.common.config.YmlConfig;
import com.ztgf.shopping.mapper.template.TempletModuleMapper;
import com.ztgf.shopping.models.bo.epg.EpgAggregationIdBO;
import com.ztgf.shopping.models.bo.template.TempletModuleBO;
import com.ztgf.shopping.models.bo.template.TempletModuleSaveBO;
import com.ztgf.shopping.models.constant.ShoppingConstant;
import com.ztgf.shopping.models.dto.template.TempletModuleDTO;
import com.ztgf.shopping.models.enums.ShoppingCodeEnum;
import com.ztgf.shopping.models.service.template.ITempletModuleService;
import com.ztgf.shopping.service.epg.*;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 模版功能模块  服务实现类
 * </p>
 *
 * @author YUE
 * @since 2020-05-23
 */
@DubboService
public class TempletModuleServiceImpl extends ServiceImpl<TempletModuleMapper, TempletModuleDTO> implements ITempletModuleService {

    @Autowired
    private TempletModuleMapper templetModuleMapper;

    @Autowired
    private EpgBannerServiceImpl epgBannerService;

    @Autowired
    private EpgMainNavigationServiceImpl epgMainNavigationService;

    @Autowired
    private EpgSectionServiceImpl epgSectionService;

    @Autowired
    private EpgShopBannerServiceImpl epgShopBannerService;

    @Autowired
    private EpgShopMainNavigationServiceImpl epgShopMainNavigationService;

    @Autowired
    private EpgShopSectionServiceImpl epgShopSectionService;

    @Autowired
    private EpgShowWindowServiceImpl epgShowWindowService;

    @Autowired
    private EpgTopicServiceImpl epgTopicService;

    @Autowired
    private EpgZtgfInfoServiceImpl epgZtgfInfoService;

    @Autowired
    private EpgAggregationBannerServiceImpl epgAggregationBannerService;

    @Autowired
    private EpgAggregationCategoryServiceImpl epgAggregationCategoryService;

    @Resource
    private YmlConfig ymlConfig;
    @Override
    public boolean add(TempletModuleSaveBO templetModuleSaveBO) {
        TempletModuleDTO templetModuleDTO = new TempletModuleDTO();
        BeanUtils.copyProperties(templetModuleSaveBO,templetModuleDTO);
        Long id = ymlConfig.getPkId();
        templetModuleDTO.setId(id);
        return this.insert(templetModuleDTO);
    }

    public Long addAndReturnId(TempletModuleSaveBO templetModuleSaveBO) {
        TempletModuleDTO templetModuleDTO = new TempletModuleDTO();
        BeanUtils.copyProperties(templetModuleSaveBO,templetModuleDTO);
        Long id = ymlConfig.getPkId();
        templetModuleDTO.setId(id);
        this.insert(templetModuleDTO);
        return id;
    }

    /**
     * 创建banner功能
     * @param templateId
     * @return
     */
    public Long createBannerModule(Long templateId){
        //创建banner功能
        TempletModuleSaveBO templetModuleSaveBO = new TempletModuleSaveBO();
        templetModuleSaveBO.setTempletId(templateId);
        templetModuleSaveBO.setName("平台活动页banner");
        templetModuleSaveBO.setKey(ShoppingCodeEnum.DECORATE_BANNER.getMsg());
        templetModuleSaveBO.setSort(0+"");
        templetModuleSaveBO.setNodes("平台活动页banner");
        templetModuleSaveBO.setModuleType(2);
        return addAndReturnId(templetModuleSaveBO);
    }

    /**
     * 创建频道
     * @param templateId
     * @return
     */
    public Long createSectionModule(Long templateId){
        //创建频道功能
        TempletModuleSaveBO templetModuleSaveBO = new TempletModuleSaveBO();
        templetModuleSaveBO.setName("平台活动页频道");
        templetModuleSaveBO.setTempletId(templateId);
        templetModuleSaveBO.setKey(ShoppingCodeEnum.DECORATE_SECTION.getMsg());
        templetModuleSaveBO.setSort(1+"");
        templetModuleSaveBO.setNodes("平台活动页频道");
        templetModuleSaveBO.setModuleType(2);
        return addAndReturnId(templetModuleSaveBO);
    }

    /**
     * 创建一个平台活动页模板功能
     */
    public EpgAggregationIdBO createPlateActiveModule(Long templateId){
        EpgAggregationIdBO epgAggregationIdBO = new EpgAggregationIdBO();
        //创建banner功能
        TempletModuleSaveBO templetModuleSaveBO = new TempletModuleSaveBO();
        templetModuleSaveBO.setTempletId(templateId);
        templetModuleSaveBO.setName("平台活动页banner");
        templetModuleSaveBO.setKey(ShoppingCodeEnum.DECORATE_BANNER.getMsg());
        templetModuleSaveBO.setSort(0+"");
        templetModuleSaveBO.setNodes("平台活动页banner");
        templetModuleSaveBO.setModuleType(2);
        Long bannerModuleId = addAndReturnId(templetModuleSaveBO);
        epgAggregationIdBO.setBannerModuleId(bannerModuleId);
        //创建频道功能
        templetModuleSaveBO.setName("平台活动页频道");
        templetModuleSaveBO.setKey(ShoppingCodeEnum.DECORATE_SECTION.getMsg());
        templetModuleSaveBO.setSort(1+"");
        templetModuleSaveBO.setNodes("平台活动页频道");
        templetModuleSaveBO.setModuleType(2);
        Long sectionModuleId = addAndReturnId(templetModuleSaveBO);
        epgAggregationIdBO.setSectionModuleId(sectionModuleId);

        List<Long> plateActiveSection = epgAggregationCategoryService.createPlateActiveSection(templateId, sectionModuleId);
        epgAggregationIdBO.setSectionIdList(plateActiveSection);
        return epgAggregationIdBO;
    }

    /**
     * 创建默认的店铺功能
     * @param shopId
     * @param homeTemplateId
     */
    public void createDefaultShopHomeModule(Long shopId,Long homeTemplateId){
        //添加店铺首页模板的默认功能（banner,shopInfo,section(新品推荐，镇店之宝，掌柜推荐)）
        TempletModuleSaveBO templetModuleSaveBO = new TempletModuleSaveBO();
        templetModuleSaveBO.setTempletId(homeTemplateId);
        templetModuleSaveBO.setName("店铺banner");
        templetModuleSaveBO.setKey(ShoppingCodeEnum.DECORATE_BANNER.getMsg());
        templetModuleSaveBO.setSort(0+"");
        templetModuleSaveBO.setNodes("店铺banner");
        templetModuleSaveBO.setModuleType(0);
        add(templetModuleSaveBO);

        templetModuleSaveBO.setTempletId(homeTemplateId);
        templetModuleSaveBO.setName("店铺信息");
        templetModuleSaveBO.setKey(ShoppingCodeEnum.DECORATE_SHOP_INFO.getMsg());
        templetModuleSaveBO.setSort(1+"");
        templetModuleSaveBO.setNodes("店铺信息");
        templetModuleSaveBO.setModuleType(0);
        add(templetModuleSaveBO);

        templetModuleSaveBO.setTempletId(homeTemplateId);
        templetModuleSaveBO.setName("店铺频道");
        templetModuleSaveBO.setKey(ShoppingCodeEnum.DECORATE_SECTION.getMsg());
        templetModuleSaveBO.setSort(2+"");
        templetModuleSaveBO.setNodes("店铺频道");
        templetModuleSaveBO.setModuleType(0);
        Long moduleId = addAndReturnId(templetModuleSaveBO);

        epgShopSectionService.createDefaultShopHomeSection(homeTemplateId,moduleId,shopId);
    }

    /**
     * 创建默认的店铺活动页功能
     * @param activeTemplateId
     */
    public void createDefaultShopActiveModule(Long activeTemplateId){
        //添加店铺首页活动页模板的默认功能（banner，分类）
        TempletModuleSaveBO templetModuleSaveBO = new TempletModuleSaveBO();
        templetModuleSaveBO.setTempletId(activeTemplateId);
        templetModuleSaveBO.setName("店铺活动页banner");
        templetModuleSaveBO.setKey(ShoppingCodeEnum.DECORATE_BANNER.getMsg());
        templetModuleSaveBO.setSort(0+"");
        templetModuleSaveBO.setNodes("店铺活动页banner");
        templetModuleSaveBO.setModuleType(2);
        add(templetModuleSaveBO);

        templetModuleSaveBO.setTempletId(activeTemplateId);
        templetModuleSaveBO.setName("店铺分类频道");
        templetModuleSaveBO.setKey(ShoppingCodeEnum.DECORATE_SECTION.getMsg());
        templetModuleSaveBO.setSort(1+"");
        templetModuleSaveBO.setNodes("店铺分类频道");
        templetModuleSaveBO.setModuleType(2);
        Long moduleId = addAndReturnId(templetModuleSaveBO);

        epgAggregationCategoryService.createDefaultShopActiveSection(activeTemplateId, moduleId);
    }

    /**
     * 创建默认的店铺 商品详情页banner的
     * @param activeTemplateId
     */
    public void createDefaultShopBannerModule(Long activeTemplateId){
        //添加店铺首页活动页模板的默认功能（banner，分类）
        TempletModuleSaveBO templetModuleSaveBO = new TempletModuleSaveBO();
        templetModuleSaveBO.setTempletId(activeTemplateId);
        templetModuleSaveBO.setName("店铺商品详情页banner");
        templetModuleSaveBO.setKey(ShoppingCodeEnum.DECORATE_BANNER.getMsg());
        templetModuleSaveBO.setSort(0+"");
        templetModuleSaveBO.setNodes("店铺商品详情页banner");
        templetModuleSaveBO.setModuleType(0);
        add(templetModuleSaveBO);

    }

    public boolean deleteByTemplateId(Long templateId) {
        Wrapper wrapper = new EntityWrapper();
        wrapper.eq("templet_id", templateId);
        templetModuleMapper.delete(wrapper);
        return true;
    }

    @Override
    public boolean deleteById(Long id) {
        deleteEPGById(id);
        templetModuleMapper.deleteById(id);
        return true;
    }

    /**
     * 根据模板信息查询功能信息 有页码
     * @param templetModuleBO
     * @return
     */
    @Override
    public Page<TempletModuleDTO> getBySelectTemplatModuleInfoPage(TempletModuleBO templetModuleBO){
        Wrapper<TempletModuleDTO> wrapper = getBySelectTemplatModuleInfo(templetModuleBO);
        return selectPage( new Page<>(templetModuleBO.getPageNo(),templetModuleBO.getPageSize()),wrapper);
    }

    /**
     * 获取所有的section信息
     * @return
     */
    public TempletModuleDTO getSectionByTemId(Long templateId){
        TempletModuleDTO templetModuleDTO = new TempletModuleDTO();
        templetModuleDTO.setTempletId(templateId);
        templetModuleDTO.setKey(ShoppingCodeEnum.DECORATE_SECTION.getMsg());
        templetModuleDTO.setIsPublish(ShoppingCodeEnum.PUBLIC_1.getCode()+"");
        templetModuleDTO.setStatus(ShoppingCodeEnum.STATUS_0.getCode()+"");
        templetModuleDTO =  templetModuleMapper.selectOne(templetModuleDTO);
        return templetModuleDTO;
    }

    /**
     * 根据模板信息查询功能信息 无页码
     * @param templetModuleBO
     * @return
     */
    @Override
    public List<TempletModuleDTO> getBySelectTemplatModuleInfoNoPage(TempletModuleBO templetModuleBO){
        templetModuleBO = addMustData(templetModuleBO);
        Wrapper<TempletModuleDTO> wrapper = getBySelectTemplatModuleInfo(templetModuleBO);
//        if(templetModuleBO.getPageNo() == 0 && templetModuleBO.getPageSize() == 0)
//            return templetModuleMapper.selectPage( new Page<>(0, ShoppingConstant.TEMPLATE_MODULE),wrapper);
        return selectList(wrapper);
    }

    /**
     * 添加必要数据
     * @param templetModuleBO
     * @return
     */
    private TempletModuleBO addMustData(TempletModuleBO templetModuleBO){
        templetModuleBO.setIsPublish(ShoppingCodeEnum.PUBLIC_1.getCode());
        templetModuleBO.setStatus(ShoppingCodeEnum.STATUS_0.getCode());
        templetModuleBO.setSort(ShoppingCodeEnum.SORT_ASC.getCode());
        return templetModuleBO;
    }

    private Wrapper<TempletModuleDTO> getBySelectTemplatModuleInfo(TempletModuleBO templetModuleBO){
        Wrapper<TempletModuleDTO> wrapper = new EntityWrapper<>();
        TempletModuleDTO templetModuleDTO = new TempletModuleDTO();
        BeanUtils.copyProperties(templetModuleBO,templetModuleDTO);
        wrapper.eq("status", templetModuleBO.getStatus());
        wrapper.eq("is_publish", templetModuleBO.getIsPublish());
        wrapper.eq("templet_id", templetModuleBO.getTempletId());
        if(ShoppingCodeEnum.SORT_DESC.getCode() == templetModuleBO.getSort().intValue())
            wrapper.orderBy("sort", false);//根据sort排序
        else
            wrapper.orderBy("sort", true);//根据sort排序

        return wrapper;
    }

    /**
     * 删除有关联关系的
     * @param id
     * @return
     */
    public boolean deleteEPGById(Long id) {
        TempletModuleDTO templetModuleDTO = selectById(id);
        if(templetModuleDTO.getModuleType() == ShoppingCodeEnum.MODULE_TYPE_0.getCode()){//是店铺首页
            if(ShoppingCodeEnum.DECORATE_BANNER.getMsg().equals(templetModuleDTO.getKey()))//店铺banner
                return epgShopBannerService.deleteByModuleId(id);

            if(ShoppingCodeEnum.DECORATE_MAIN_NAVIGATION.getMsg().equals(templetModuleDTO.getKey()))//主导航
                return epgShopMainNavigationService.deleteByModuleId(id);

            if(ShoppingCodeEnum.DECORATE_SECTION.getMsg().equals(templetModuleDTO.getKey()))//频道栏目
                return epgShopSectionService.deleteByModuleId(id);
        }
        else if(templetModuleDTO.getModuleType() == ShoppingCodeEnum.MODULE_TYPE_1.getCode()){//平台首页
            if(ShoppingCodeEnum.DECORATE_BANNER.getMsg().equals(templetModuleDTO.getKey()))//banner
                return epgBannerService.deleteByModuleId(id);

            if(ShoppingCodeEnum.DECORATE_MAIN_NAVIGATION.getMsg().equals(templetModuleDTO.getKey()))//主导航
                return epgMainNavigationService.deleteByModuleId(id);

            if(ShoppingCodeEnum.DECORATE_SECTION.getMsg().equals(templetModuleDTO.getKey()))//频道栏目
                return epgSectionService.deleteByModuleId(id);

            if(ShoppingCodeEnum.DECORATE_TOPIC.getMsg().equals(templetModuleDTO.getKey()))//推荐专区
                return epgTopicService.deleteByModuleId(id);

            if(ShoppingCodeEnum.DECORATE_SHOW_WINDOW.getMsg().equals(templetModuleDTO.getKey()))//新鲜好物
                return epgShowWindowService.deleteByModuleId(id);

            if(ShoppingCodeEnum.DECORATE_ZTGF_INFO.getMsg().equals(templetModuleDTO.getKey()))//中铁工服信息配置
                return epgZtgfInfoService.deleteByModuleId(id);
        }else{//活动页
            if(ShoppingCodeEnum.DECORATE_BANNER.getMsg().equals(templetModuleDTO.getKey()))//banner
                return epgAggregationBannerService.deleteByModuleId(id);

            if(ShoppingCodeEnum.DECORATE_SECTION.getMsg().equals(templetModuleDTO.getKey()))//频道栏目
                return epgAggregationCategoryService.deleteByModuleId(id);
        }
        return true;
    }
}
